package models

import (
	"jnjword/utils"

	"gorm.io/gorm"
)

// WordBasic 单词表结构体，关联用户ID
type WordBasic struct {
	gorm.Model        // 包含ID, CreatedAt, UpdatedAt, DeletedAt（逻辑删除）
	UserID     uint   // 关联用户表的ID（外键），确保每个单词属于特定用户
	Word       string // 单词
	Chinese    string // 中文释义
}

// 表名定义
func (WordBasic) TableName() string {
	return "word_basic"
}

// CreateUserWord 给指定用户新增单词（需传入UserID）
func CreateUserWord(word WordBasic) *gorm.DB {
	// 注意：调用时需确保word.UserID已赋值（当前登录用户的ID）
	return utils.DB.Create(&word)
}

// GetUserWordList 查询指定用户的所有单词
func GetUserWordList(userID uint) []*WordBasic {
	var words []*WordBasic
	// 条件：user_id = 目标用户ID，查询该用户的所有单词
	utils.DB.Where("user_id = ?", userID).Find(&words)
	return words
}

// GetWordByID 查询用户的单个单词（按单词ID，确保归属当前用户）
func GetWordByID(userID, wordID uint) *WordBasic {
	var word WordBasic
	// 条件：必须同时满足user_id=当前用户ID + id=单词ID（防止查询其他用户的单词）
	utils.DB.Where("user_id = ? AND id = ?", userID, wordID).First(&word)
	return &word
}

// SearchWordByContent 按单词内容模糊查询用户的单词
func SearchWordByContent(userID uint, keyword string) []*WordBasic {
	var words []*WordBasic
	// 条件：user_id=当前用户 + word字段包含关键词（不区分大小写）
	utils.DB.Where("user_id = ? AND word LIKE ?", userID, "%"+keyword+"%").Find(&words)
	return words
}

// UpdateUserWord 更新用户的单词（需传入用户ID和单词ID）
func UpdateUserWord(userID uint, updateWord WordBasic) *gorm.DB {
	// 条件：只更新当前用户的单词（user_id=当前用户ID + id=单词ID）
	// 更新字段：仅更新Word和Chinese（按需调整）
	return utils.DB.Model(&WordBasic{}).
		Where("user_id = ? ", userID).
		Updates(map[string]interface{}{
			"word":    updateWord.Word,
			"chinese": updateWord.Chinese,
		})
}

// DeleteUserWord 删除用户的单词（需传入用户ID和单词ID）
func DeleteUserWord(userID uint, wordname string) *gorm.DB {
	var word WordBasic
	// 条件：只删除当前用户的单词（user_id=当前用户ID + id=单词ID）
	return utils.DB.Where("user_id = ? AND word = ?", userID, wordname).Delete(&word)
}

// 检查用户是否已添加过该单词（避免重复）
func CheckWordDuplicate(userID uint, word string) bool {
	var count int64
	// 条件：同一用户（user_id）+ 相同单词（word）
	utils.DB.Model(&WordBasic{}).
		Where("user_id = ? AND word = ?", userID, word).
		Count(&count)
	return count > 0 // 大于0表示已存在（重复）
}
